local key = KEYS[1]
local threadId  = ARGV[1]
local releaseTime = ARGV[2]

-- 1、判断要释放的锁是否存在
if (redis.call('hexists', key, threadId) == 0) then
    return nil
end
-- 2、锁存在，引用计数减1
local count = redis.call('HINCRBY', key, threadId, -1);

-- 进一步判断是否需要释放锁
if (count > 0) then
    -- 重入次数大于0，说明不能释放锁，且刷新锁的有效期
    redis.call('EXPIRE', key, releaseTime);
    return nil;
else
    -- 重入次数等于0，说明可以释放锁
    redis.call('DEL', key);
    return nil;
end